package Reflect.Test;

import java.io.FileInputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author: zcw
 * @version: 1.0
 * 反射获取字段 控制器测试
 */
public class Demo01 {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties ();
        properties.load (new FileInputStream ("src\\Reflect\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString ();
        String method = properties.get("method").toString ();
        System.out.println ("classfullpath = " + classfullpath + " method = " + method);
        //3利用反射机制
        //（1）加载类，返回Class类型的对象
        Class cls = Class.forName (classfullpath);
        //(2)通过 cls 得到你加载的类 Reflect.Test.Cat 的对象实例
        Object o = cls.newInstance ();
        //(3)通过 cls 得到你加载的类 Reflect.Test.Cat 的 method 的方法对象
        //即： 在反射中，可以把方法视为对象（万物皆对象）
        Method method1 = cls.getMethod (method);
        //(4)通过 metho1 调用方法：即通过方法对象来实现调用方法
        method1.invoke (o);

        Main.fg ();
        //得到name字段
        //getField不能得到私有的属性
        Field name = cls.getField ("age");
        System.out.println (name.get (o));

        //得到构造器
            //  无参
        Constructor constructor = cls.getConstructor ();
        System.out.println (constructor);

            //  带参
        Constructor constructor1 = cls.getConstructor (String.class);
        System.out.println (constructor1);
    }
}
